package com.luoshizhen.lease.web.admin.controller.lease;


import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.luoshizhen.lease.common.result.Result;
import com.luoshizhen.lease.model.entity.ViewAppointment;
import com.luoshizhen.lease.model.enums.AppointmentStatus;
import com.luoshizhen.lease.web.admin.service.ViewAppointmentService;
import com.luoshizhen.lease.web.admin.vo.appointment.AppointmentQueryVo;
import com.luoshizhen.lease.web.admin.vo.appointment.AppointmentVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


@Tag(name = "预约看房管理")
@RequestMapping("/admin/appointment")
@RestController
public class ViewAppointmentController {

    @Autowired
    private ViewAppointmentService service;

    /**
     * 分页查询预约信息
     *
     * @param current 当前页码，用于指定从哪一页开始查询
     * @param size    每页记录数，用于限制每页返回的记录数量
     * @param queryVo 查询条件对象，包含用于过滤查询结果的各种条件
     * @return 返回查询结果，包括预约信息的分页列表
     */
    @Operation(summary = "分页查询预约信息")
    @GetMapping("page")
    public Result<IPage<AppointmentVo>> page(@RequestParam long current, @RequestParam long size, AppointmentQueryVo queryVo) {
        // 创建分页对象，传入当前页码和每页大小
        IPage<AppointmentVo> page = new Page<>(current, size);
        // 调用服务方法，根据查询条件和分页信息获取预约信息列表
        IPage<AppointmentVo> list = service.pageAppointmentByQuery(page, queryVo);
        // 返回查询结果，使用Result.ok表示操作成功
        return Result.ok(list);
    }

    /**
     * 更新预约状态
     *
     * 根据提供的预约ID和新的预约状态，更新数据库中对应预约记录的状态
     * 此方法使用POST请求，因为它会修改服务器上的资源（预约状态）
     *
     * @param id 预约的唯一标识符，用于定位需要更新的预约记录
     * @param status 新的预约状态，用于更新预约记录
     * @return 返回更新操作的结果，如果更新成功，则返回Result.ok()
     */
    @Operation(summary = "根据id更新预约状态")
    @PostMapping("updateStatusById")
    public Result updateStatusById(@RequestParam Long id, @RequestParam AppointmentStatus status) {
        // 创建更新条件构造器
        LambdaUpdateWrapper<ViewAppointment> updateWrapper = new LambdaUpdateWrapper<>();
        // 设置更新条件为预约ID等于传入的id
        updateWrapper.eq(ViewAppointment::getId, id);
        // 设置需要更新的字段值，即将预约状态更新为传入的状态
        updateWrapper.set(ViewAppointment::getAppointmentStatus,status);
        // 执行更新操作
        service.update(updateWrapper);
        // 返回操作结果
        return Result.ok();
    }

}
